package com.ruoyi.wechat.service.impl;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.wechat.service.IWxLoginService;
import com.ruoyi.wechat.utils.WechatLoginUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class IWxLoginServiceImpl implements IWxLoginService {
    @Autowired
    private WechatLoginUtil wechatLoginUtil;

    @Autowired
    private SysUserMapper userMapper;

    @Autowired
    private TokenService tokenService;
    @Autowired
    private ISysRoleService sysRoleService;

    /**
     * 小程序登录核心逻辑
     * @param code 登录凭证code
     * @return JWT Token
     */
    @Override
    public String miniAppLogin(String code) {
        // 1. 调用微信接口获取openid
        JSONObject wxResult = wechatLoginUtil.getOpenidAndSessionKey(code);
        String openid = wxResult.getString("openid");
        if (StringUtils.isEmpty(openid)) {
            throw new RuntimeException("获取openid失败：" + wxResult.getString("errmsg"));
        }

        // 2. 根据openid查询系统用户
        SysUser user = userMapper.selectUserByOpenid(openid);
        if (user != null) {
            // 3. 已存在用户：直接生成Token
            return generateToken(user);
        } else {
            // 4. 不存在用户：自动注册（可根据业务调整注册逻辑，如绑定手机号等）
            SysUser newUser = createMiniAppUser(openid);
            return generateToken(newUser);
        }
    }

    /**
     * 自动注册小程序用户
     * @param openid 微信openid
     * @return 新注册的用户
     */
    @Override
    public SysUser createMiniAppUser(String openid) {
        SysUser user = new SysUser();
        user.setUserName("mini_" + UUID.randomUUID().toString().substring(0, 8)); // 生成唯一用户名
        user.setNickName("小程序用户"); // 默认昵称
        user.setOpenId(openid);
        user.setPassword(SecurityUtils.encryptPassword("123456")); // 默认密码（可后续让用户修改）
        user.setStatus("0"); // 账号启用
        user.setDelFlag("0"); // 未删除
        user.setLoginType(1); // 登录类型
        user.setUserType("1"); // 未删除
        user.setDeptId(201L); // 添加部门
        userMapper.insertUser(user);
        // todo 添加角色 添加部门
        sysRoleService.insertAuthUsers(100L, new Long[]{user.getUserId()});
        // 插入用户（RuoYi自带的用户Service可直接调用，这里简化处理）
        return user;
    }

    /**
     * 生成JWT Token
     * @param user 系统用户
     * @return Token字符串
     */
    @Override
    public String generateToken(SysUser user) {
        LoginUser loginUser = new LoginUser(user, null);
        // 生成Token（复用RuoYi自带的TokenService）
        return tokenService.createToken(loginUser);
    }
}